// 案例开放027 [进制移位UTF] 0319上机编程“编码格式校验”学习交流
// http://3ms.huawei.com/km/groups/3803117/blogs/details/10080821
// 假设X-UTF编码格式是一种变长字节编码方式，对于每个字符都有一个唯一编号值（如汉字“华”的编号值是21326）。每个字符按X-UTF编码后为n个字节（n
// 的范围为 [1,6] ），各字节需符合以下规则： l  单字节字符 (即 n =
// 1)：字节的第一位（bit）为 0 。其余位为有效位。 l  多字节字符 (即 n >
// 1)：第一个字节的前 n 位都为 1，第 n+1 位为 0；后面字节的前两位都为
// 10。其余位为有效位。 二进制表示如下： 1字节 0xxxxxxx 2字节 110xxxxx 10xxxxxx
// 3字节 1110xxxx 10xxxxxx 10xxxxxx
// 4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
// 5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
// 6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
// 判断是否是某字符的合法X-UTF编码：

#include <stdio.h>
#include <string.h>

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 1字节 0xxxxxxx
// 2字节 110xxxxx 10xxxxxx
// 3字节 1110xxxx 10xxxxxx 10xxxxxx
// 4字节 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
// 5字节 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
// 6字节 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

int EncodingVerify(string strInput) {
  const static int BIT_NUM = 6;
  const static int MOVE_NUM = 7;
  int res;
  int nByteCnt = strInput.length() / 2;
  int a[BIT_NUM] = {0};
  if (sscanf_s(strInput.c_str(), "%2x%2x%2x%2x%2x%2x", &a[0], &a[1], &a[2],
               &a[3], &a[4], &a[5]) == -1) {
    return -1;
  }
  // 单字节:判断最高位是0
  if (nByteCnt == 1) {
    return ((a[0] >> MOVE_NUM) == 0) ? a[0] : -1;
  }
  // 2字节以上:
  // E980A5  3字节 byteHead = 0b10000 - 0b10 = 0b1110
  // 位相同异或=0
  int byteHead = (1 << (nByteCnt + 1)) - 2;
  if (((a[0] >> (MOVE_NUM - nByteCnt)) ^ byteHead) != 0) {
    return -1;
  }
  // 取首字节有效位数值
  res = a[0] & ((1 << (MOVE_NUM - nByteCnt)) - 1);
  for (int i = 1; i < nByteCnt; i++) {
    // 剩余字节校验
    if (((a[i] >> BIT_NUM) ^ 2) != 0) {
      return -1;
    }
    // 剩余字节数值有效位6
    res = (res << BIT_NUM) | (a[i] & ((1 << MOVE_NUM) - 1));
  }
  return res;
}

int main(void) {
  printf("%d", EncodingVerify("E980A5"));
  return 0;
}
